package com.jvyou.app.common.utils.value;

import com.jvyou.app.common.enums.HttpCodeEnum;
import com.jvyou.app.common.exception.AppException;

/**
 * 参数校验工具类，类似 Guava 的 Preconditions
 *
 * @author 橘柚
 * @version 1.0
 * @date 2025/3/19
 */
public class ValueChecker {

    /**
     * 断言表达式为 true，否则抛出异常
     *
     * @param expression 条件
     * @param message    错误信息
     */
    public static void checkArgument(boolean expression, String message) {
        if (!expression) {
            throw new AppException(HttpCodeEnum.BAD_REQUEST, message);
        }
    }

    /**
     * 断言表达式为 true，否则抛出异常
     *
     * @param expression   条件
     * @param httpCodeEnum 自定义错误码
     */
    public static void checkArgument(boolean expression, HttpCodeEnum httpCodeEnum) {
        if (!expression) {
            throw new AppException(httpCodeEnum);
        }
    }

    /**
     * 断言对象不为 null
     *
     * @param reference 对象
     * @param message   错误信息
     * @param <T>       对象类型
     * @return reference 本身
     */
    public static <T> T checkNotNull(T reference, String message) {
        if (reference == null) {
            throw new AppException(HttpCodeEnum.BAD_REQUEST, message);
        }
        return reference;
    }

    /**
     * 断言字符串不为空
     *
     * @param str     字符串
     * @param message 错误信息
     */
    public static void checkNotEmpty(String str, String message) {
        if (str == null || str.trim().isEmpty()) {
            throw new AppException(HttpCodeEnum.BAD_REQUEST, message);
        }
    }

    /**
     * 断言集合不为空
     *
     * @param iterable 集合
     * @param message  错误信息
     */
    public static void checkNotEmpty(Iterable<?> iterable, String message) {
        if (iterable == null || !iterable.iterator().hasNext()) {
            throw new AppException(HttpCodeEnum.BAD_REQUEST, message);
        }
    }

    /**
     * 断言索引在范围内
     *
     * @param index   索引
     * @param size    最大值
     * @param message 错误信息
     */
    public static void checkElementIndex(int index, int size, String message) {
        if (index < 0 || index >= size) {
            throw new AppException(HttpCodeEnum.BAD_REQUEST, message);
        }
    }


    /**
     * 验证中国合法的手机号
     *
     * @param phoneNumber 手机号字符串
     */
    public static void checkChinaPhoneNumber(String phoneNumber) {
        // 1. 判断手机号是否为空
        checkNotEmpty(phoneNumber, "请输入手机号");
        // 2. 中国手机号正则：1开头，第二位3-9，后面9位数字
        String regex = "^1[3-9]\\d{9}$";
        if (!phoneNumber.matches(regex)) {
            throw new AppException(HttpCodeEnum.BAD_REQUEST, "请输入正确的手机号");
        }
    }

    /**
     * 断言状态合法
     *
     * @param expression 条件
     * @param message    错误信息
     */
    public static void checkState(boolean expression, String message) {
        if (!expression) {
            throw new AppException(HttpCodeEnum.BAD_REQUEST, message);
        }
    }

    /**
     * 断言数组或集合不为空
     *
     * @param array   数组或集合
     * @param message 错误信息
     * @param <T>     类型
     */
    public static <T> void checkNotEmpty(T[] array, String message) {
        if (array == null || array.length == 0) {
            throw new AppException(HttpCodeEnum.BAD_REQUEST, message);
        }
    }

    /**
     * 断言数值大于 0
     *
     * @param number  数值
     * @param message 错误信息
     */
    public static void checkPositive(Number number, String message) {
        if (number == null || number.doubleValue() <= 0) {
            throw new AppException(HttpCodeEnum.BAD_REQUEST, message);
        }
    }

    /**
     * 断言数值在范围内
     *
     * @param number  数值
     * @param min     最小值（包含）
     * @param max     最大值（包含）
     * @param message 错误信息
     */
    public static void checkRange(Number number, Number min, Number max, String message) {
        if (number == null || number.doubleValue() < min.doubleValue() || number.doubleValue() > max.doubleValue()) {
            throw new AppException(HttpCodeEnum.BAD_REQUEST, message);
        }
    }
}
